#include "ReceptionInfosApache.h"
#include "socket_utils.h"

/*************************************************************************
                        ReceptionInfosApache  -  description
                             -------------------
Cette tâche écoute les commande qui sont envoyées par le serveur Apache (commandes pour l'ajout /
suppression de capteurs ou ordre actionneur)

*************************************************************************/

//---------- Réalisation de la tâche <ReceptionInfosApache> (fichier ReceptionInfosProxy.cpp) ---



//------------------------------------------------------ Fonctions privées



void ReceptionInfosApacheInit(int balInfo)
{
	idBal = balInfo;
}

void ReceptionInfosApacheMoteur()
{
	SOCKET sock = init_connection(PORT_ECOUTE_APACHE, MAX_CLIENTS_APACHE);
   char buffer[BUF_SIZE_APACHE];
   /* the index for the array */
   int actual = 0;
   int max = sock;
   /* an array for all clients sockets */
   SOCKET clientsApache[MAX_CLIENTS_APACHE];

   fd_set rdfs;

   while(1)
   {
	  int i = 0;
	  FD_ZERO(&rdfs);

	  /* add STDIN_FILENO */
	  FD_SET(STDIN_FILENO, &rdfs);

	  /* add the connection socket */
	  FD_SET(sock, &rdfs);

	  /* add socket of each client */
	  for(i = 0; i < actual; i++)
	  {
		 FD_SET(clientsApache[i], &rdfs);
	  }

	  if(select(max + 1, &rdfs, NULL, NULL, NULL) == -1)
	  {
		  perror("[ReceptionInfosApache] Erreur select()");

		  exit(errno);
	  }

	  /* something from standard input : i.e keyboard */
	  if(FD_ISSET(STDIN_FILENO, &rdfs))
	  {
		 /* stop process when type on keyboard */
		 break;
	  }
	  else if(FD_ISSET(sock, &rdfs))
	  {
		 /* new client */
		 SOCKADDR_IN csin = { 0 };
		 size_t sinsize = sizeof csin;
		 int csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
		 if(csock == SOCKET_ERROR)
		 {
			perror("[ReceptionInfosApache] Erreur accept()");
			char descrp[] = "problème au niveau de l'accept() du serveur pour une connexion du serveur apache";
			logEvent(2,descrp);
			continue;
		 }
		 printf("[ReceptionInfosApache] Nouveau client sur le socket %i\n", csock);
		 char descrp2[] = "nouvelle connexion du serveur apache au serveur";
		 logEvent(1 ,descrp2);
		 int longueur = 0;
		 //après s'etre connecté le client envoie la commande
		 if((longueur = read_client(csock, buffer, BUF_SIZE_APACHE)) == -1)
		 {
			//le client a été déconnecté
			perror("[ReceptionInfosApache] Le client s'est déconnecté\n");
			continue;
		 }
		 printf("ReceptionInfosApache] Longueur du buffer : %i; Commande recue du serveur Apache : %s \n",longueur, buffer);
		 char descrp3[] = "données reçues par le serveur du serveur apache";
		 logEvent(1 ,descrp3);
		 //char* message;
		 //message = buffer + 2 * sizeof(char); //on enlève les 2 premières cases de buffer qui contiennent le type du message
		 MsgInformation msgInfo;
		 printf("[ReceptionInfosApache] Message à analyser : %s\n", buffer);

		 //on fait d'abord le parsing
		 char* parse[4];
		 parse[0] = strtok (buffer,"$,-");
		 printf("parse[0] : %s \n",parse[0]);
		 //strcpy(msgInfo.info.idCapteur,parse[0]);
		 int i = 0;
		 while(parse[i] != NULL && i<4)
		 {
			 i++;
			 parse[i] = strtok (NULL,"$,-");
		 }

		 //ensuite on regarde le type de message reçu
		 if(strcmp(parse[0],"1") == 0) //demande de création d'un capteur / actionneur
		 {
			 printf("[ReceptionInfosApache] demande de création d'un capteur / actionneur \n");
			 char descrp4[] = "demande création d'un capteur / actionneur via apache";
			 logEvent(1 ,descrp4);
			 msgInfo.msgType = 4;
			 msgInfo.info.date[0] = '\0';
			 msgInfo.info.valeur[0] = '\0';
			 strcpy(msgInfo.info.idCapteur,parse[1]);
			 strcpy(msgInfo.info.typeCapteur,parse[2]);
		 }
		 else if (strcmp(parse[0],"2") == 0) //demande de suppression d'un capteur / actionneur
		 {
			 printf("[ReceptionInfosApache] demande de suppression d'un capteur / actionneur \n");
			 char descrp4[] = "demande de suppression d'un capteur / actionneur via apache";
			 logEvent(1 ,descrp4);
			 msgInfo.msgType = 5;
			 msgInfo.info.date[0] = '\0';
			 msgInfo.info.typeCapteur[0] = '\0';
			 msgInfo.info.valeur[0] = '\0';
			 strcpy(msgInfo.info.idCapteur,parse[1]);
		 }
		 else if (strcmp(parse[0],"3") == 0) //demande de commande d'un actionneur
		 {
			 printf("[ReceptionInfosApache] demande de commande d'un actionneur \n");
			 char descrp4[] = "demande de commande d'un actionneur via apache";
			 logEvent(1 ,descrp4);
			 msgInfo.msgType = 3;
			 msgInfo.info.date[0] = '\0';
			 msgInfo.info.typeCapteur[0] = '\0';
			 strcpy(msgInfo.info.idCapteur,parse[1]);
			 strcpy(msgInfo.info.valeur,parse[2]);
		 }
		 else if (strcmp(parse[0],"4") == 0) //demande de mesure d'un capteur
		 {
			 printf("[ReceptionInfosApache] demande de mesure d'un capteur \n");
			 //TODO
		 }
		 else //type inconnu
		 {
			 continue; //on ignore le message
		 }

		 printf("[ReceptionInfosApache] Transmission info à la boite aux lettres\n");

		int ctrl = msgsnd(idBal, &msgInfo, sizeof(Information),0);
		if(ctrl != -1)
		{
			printf("[ReceptionInfosApache] Message envoyé \n");
		}
		else
		{
			perror("[ReceptionInfosApache] Erreur d'envoi \n");
		}

		 //char buff[BUF_SIZE_APACHE];
		 //sprintf(&buff, "%s%s%s", ADRESSE_BOITIER, "$", CHAINE_REFERENCEMENT_CAPTEURS_TEST);
		 //printf("Commande d'initialisation du proxy : %s\n", buff);
		 //write_client(csock, buff);

		 /* what is the new maximum fd ? */
		 max = csock > max ? csock : max;

		 FD_SET(csock, &rdfs);

		 //strncpy(c.name, buffer, BUF_SIZE - 1);
		 clientsApache[actual] = csock;
		 actual++;
	  }
	  else
	  {
		 int i = 0;
		 for(i = 0; i < actual; i++)
		 {
			//a client is talking
			if(FD_ISSET(clientsApache[i], &rdfs))
			{
			   SOCKET client = clientsApache[i];

			   printf("[ReceptionInfosApache] Attente que le client parle\n");
			   int c = read_client(clientsApache[i], buffer, BUF_SIZE_APACHE);
			   //client disconnected
			   if(c == 0)
			   {
				  close(clientsApache[i]);
				  remove_client(clientsApache, i, &actual);
				  //strncpy(buffer, client, BUF_SIZE - 1);
				  //strncat(buffer, " disconnected !", BUF_SIZE - strlen(buffer) - 1);
				  //send_message_to_all_clients(clients, client, actual, buffer, 1);
				  printf("[ReceptionInfosApache]  %i disconnected\n", client);
				  char descrp4[] = "deconnexion du serveur apache du serveur";
				  logEvent(1 ,descrp4);
			   }
			   else
			   {
				   printf("[ReceptionInfosApache] Message recu : %s\n", buffer);
				   //ParserTrame(buffer+ 2 * sizeof(char), idBalInfos);
				  //send_message_to_all_clients(clients, client, actual, buffer, 0);
			   }
			   break;
			}
		 }
	  }
   }
   end_connection(sock);
}

//////////////////////////////////////////////////////////////////  PUBLIC
//---------------------------------------------------- Fonctions publiques
void ReceptionInfosApache(void* bal)
{
	//char message[]="01$12.4%02$13.5";

	printf("[ReceptionInfosApache] Thread ReceptionInfosApache démarré\n");
	int balInfo = (int)bal;
	ReceptionInfosApacheInit(balInfo);
	ReceptionInfosApacheMoteur();
	//ParserTrame(message);
}


